package 一四省;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Vector;


public class q7 {

	public static List<Vector<Integer>> tree = new ArrayList<Vector<Integer>>();
	public static int[][] dp = new int[100006][2];
	public static int mod = 10007;
	
	/* 
	1. 所有的结点都包含两个成员, beChoosedCount 和 beAbandonCount, 分别代表该结点被选择时带来的方案数 和 被抛弃时带来的方案数, 并且这两个值的初始化都是1, 因为无论如何, 被选是1种情况, 不被选也是1种情况. 比如说, 一个物品放在桌面上, 我们能对它有多少中操作方式呢 ? 大家都知道是2种 : 拿或不拿. 所以, 操作总数 = beChoosedCount + beAbandonCount. 
	2. 当已知下属子树的操作方案信息, 如何求原树的操作方案信息 ? 按着题意, 原树的根节点代表子树根节点的上司, 而且上司与下属只能选其一, 所以, 我们能有如下的关系式: 
	上司的beChoosedCount = 累乘( 下属的beAbandonCount ); 
	上司的beAbandonCount = 累乘( 下属的总操作数 ) = 累乘( 下属的beChoosedCount + 下属的beAbandonCount ); 
	*/
	public static void dfs(int t){
		dp[t][0] = 0;
		dp[t][1] = 0;
		int s0=1;int s1=1;
		for(int i=0;i<tree.get(t).size();i++){
			int v = tree.get(t).elementAt(i);
			dfs(v);
			s0 = s0*(dp[v][0] + dp[v][1])%mod;//当上司不选时，下属可以选也可以不选
			s1=s1*(dp[v][0])%mod;//当选择上司时，下司只能不选 
		}
		
		dp[t][0]=(dp[t][0]+s0)%mod;//不选上司的所有情况
		dp[t][1]=(dp[t][1]+s1)%mod;//选上司的所有情况
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        scanner.nextLine();
        
        for(int i=0;i<100006;i++){
        	tree.add(new Vector<Integer>());
        }
        
        for(int i=2;i<=n;i++){
        	tree.get(scanner.nextInt()).add(i);
        }
        scanner.nextLine();
        dfs(1);
        
        System.out.println(dp[1][0]+dp[1][1] - 1);
        
	}

}
